#ifndef _STANDARD_H_
#define _STANDARD_H_

#define NB_FIXES 5
#define NB_MESSAGES_MAX 10

extern void lancerConversation(int sender, int receiver);
extern void configReceiver(int receiver, int canal, int numCorrespondant);

// structure définissant les abonnes
typedef struct  {
	int numero;
	int repondeur;
	int numAppelManque;
	// String dateAppelManque = "";
} abonnes;

// structure définissant les messages
typedef struct  {
	int sender;
	int receiver;
} message;

// structure définissant les arguments des threads de communication
typedef struct  {
	int sender;
	int receiver;
	int indiceUtilise;
} threadsArgs;

// Tableau repertoriant les abonnes
abonnes fixesAbonnes[NB_FIXES];

// Tableau contenant les messages lors des echanges
message messagePool[NB_MESSAGES_MAX];

// Ce mutex protège la recherche d'une case libre dans messagePool pour communiquer
pthread_mutex_t mutexRecherche = PTHREAD_MUTEX_INITIALIZER;

// Ces mutex assurent la synchronisation des communications dans chaque thread de communication
// Il y en a 2 par canal de communication possible
pthread_mutex_t tabMutexMess[NB_MESSAGES_MAX] = {PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER};

pthread_mutex_t tabMutexMess2[NB_MESSAGES_MAX] = {PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER};

int ouvrirCommunication(int appelant, int appele);

void activerRepondeurTel(int monNum);

void desactiverRepondeurTel(int monNum);

void abonnerFixe(int numero);

int demarrerCommunication(int appelant, int appele);

void* communication(void* args);

void lockMutex(int indice);

void unlockMutex2(int indice);

#endif
